home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 2: Applications / Linux Cubed Series 2 - Applications.iso / database / hl / hl-1.000 / hl-1 / TkInterface / TkCardRecord.cc < prev    next >
Encoding:
C/C++ Source or Header  |  1995-04-22  |  12.6 KB  |  444 lines

  1. /*
  2.  * ------------------------------------------------------------------
  3.  * Home Libarian 1.0B by Deepwoods Software
  4.  * ------------------------------------------------------------------
  5.  * TkCardRecord.cc - Tcl/Tk Interface for CardRecord class
  6.  * Created by Robert Heller on Mon Apr 17 14:00:46 1995
  7.  * ------------------------------------------------------------------
  8.  * Modification History: 
  9.  * ------------------------------------------------------------------
  10.  * Contents:
  11.  * ------------------------------------------------------------------
  12.  *  
  13.  *     Home Librarian Database -- a program for maintaining a database
  14.  *                                for a home library
  15.  *     Copyright (C) 1991-1995  Robert Heller D/B/A Deepwoods Software
  16.  *             51 Locke Hill Road
  17.  *             Wendell, MA 01379-9728
  18.  * 
  19.  *     This program is free software; you can redistribute it and/or modify
  20.  *     it under the terms of the GNU General Public License as published by
  21.  *     the Free Software Foundation; either version 2 of the License, or
  22.  *     (at your option) any later version.
  23.  * 
  24.  *     This program is distributed in the hope that it will be useful,
  25.  *     but WITHOUT ANY WARRANTY; without even the implied warranty of
  26.  *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  27.  *     GNU General Public License for more details.
  28.  * 
  29.  *     You should have received a copy of the GNU General Public License
  30.  *     along with this program; if not, write to the Free Software
  31.  *     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  32.  * 
  33.  *  
  34.  */
  35.  
  36. #include <TkCardRecord.h>
  37.  
  38. void_pt TkCardRecord::Handles = NULL;
  39.  
  40. int TkCardRecord::TclFunction(Tcl_Interp *interp,int argc, char *argv[])
  41. {
  42.     if (argc == 1)
  43.     {
  44.         Card *c = &(*CardRec);
  45.         // no option, echo slots
  46.         Tcl_DString result;
  47.         Tcl_DStringInit(&result);
  48.         Tcl_DStringAppendElement(&result,"CardRecord");
  49.  
  50.         Tcl_DStringStartSublist(&result);
  51.         Tcl_DStringAppendElement(&result,"type");
  52.         Tcl_DStringAppendElement(&result,TypeName(c->type));
  53.         Tcl_DStringEndSublist(&result);
  54.  
  55.         Tcl_DStringStartSublist(&result);
  56.         Tcl_DStringAppendElement(&result,"author");
  57.         Tcl_DStringAppendElement(&result,c->author);
  58.         Tcl_DStringEndSublist(&result);
  59.  
  60.         Tcl_DStringStartSublist(&result);
  61.         Tcl_DStringAppendElement(&result,"title");
  62.         Tcl_DStringAppendElement(&result,c->title);
  63.         Tcl_DStringEndSublist(&result);
  64.  
  65.         Tcl_DStringStartSublist(&result);
  66.         Tcl_DStringAppendElement(&result,"publisher");
  67.         Tcl_DStringAppendElement(&result,c->publisher);
  68.         Tcl_DStringEndSublist(&result);
  69.  
  70.         Tcl_DStringStartSublist(&result);
  71.         Tcl_DStringAppendElement(&result,"city");
  72.         Tcl_DStringAppendElement(&result,c->city);
  73.         Tcl_DStringEndSublist(&result);
  74.  
  75.         Tcl_DStringStartSublist(&result);
  76.         Tcl_DStringAppendElement(&result,"description");
  77.         Tcl_DStringAppendElement(&result,c->description);
  78.         Tcl_DStringEndSublist(&result);
  79.  
  80.         Tcl_DStringStartSublist(&result);
  81.         Tcl_DStringAppendElement(&result,"vol");
  82.         {
  83.             ostrstream stream;
  84.             stream << c->vol;
  85.             _IO_ssize_t i = stream.pcount();
  86.             char *s = stream.str();
  87.             s[i] = '\0';
  88.             Tcl_DStringAppendElement(&result,s);
  89.             stream.freeze(0);
  90.         }
  91.         Tcl_DStringEndSublist(&result);
  92.         
  93.         Tcl_DStringStartSublist(&result);
  94.         Tcl_DStringAppendElement(&result,"year");
  95.         {
  96.             ostrstream stream;
  97.             stream << c->year;
  98.             _IO_ssize_t i = stream.pcount();
  99.             char *s = stream.str();
  100.             s[i] = '\0';
  101.             Tcl_DStringAppendElement(&result,s);
  102.             stream.freeze(0);
  103.         }
  104.         Tcl_DStringEndSublist(&result);
  105.  
  106.         Tcl_DStringResult(interp,&result);
  107.         return TCL_OK;
  108.     }
  109.     if (argc < 2)
  110.     {
  111.         Tcl_AppendResult(interp, "wrong # args: should be \"",
  112.                  argv[0], " option ?arg arg ...?\"",
  113.                  (char *) NULL);
  114.         return TCL_ERROR;
  115.     }
  116.     if (strcmp(argv[1], "type") == 0)
  117.     {
  118.         if (argc != 2)
  119.         {
  120.             Tcl_AppendResult(interp, "wrong # args: should be \"",
  121.                      argv[0]," ",argv[1],(char *) NULL);
  122.             return TCL_ERROR;
  123.         }
  124.         Tcl_AppendResult(interp, "CardRecord", (char *) NULL);
  125.         return TCL_OK;
  126.     } else if (strcmp(argv[1], "cardtype") == 0)
  127.     {
  128.         if (argc == 3)
  129.         {
  130.             if (!CardTypeNameP(argv[2]))
  131.             {
  132.                 Tcl_AppendResult(interp, "Bad card type: ",
  133.                          argv[2]," should be one of {",
  134.                          "book magazine cd ",
  135.                          "audiocassette album ",
  136.                          "laserdisk vhsvideo betavideo ",
  137.                          "eightmm eighttrack dat other}",
  138.                          (char *) NULL);
  139.                 return TCL_ERROR;
  140.             }
  141.             (*CardRec)->type = NameType(argv[2]);
  142.         } else if (argc > 3)
  143.         {
  144.             Tcl_AppendResult(interp, "wrong # args: should be \"",
  145.                      argv[0]," ",argv[1]," ?value?\"",
  146.                      (char *) NULL);
  147.             return TCL_ERROR;
  148.         }
  149.         Tcl_AppendResult(interp, TypeName((*CardRec)->type), (char *) NULL);
  150.         return TCL_OK;
  151.     } else if (strcmp(argv[1], "author") == 0)
  152.     {
  153.         if (argc == 3)
  154.         {
  155.             Author = argv[2];
  156.             (*CardRec)->author = (char*) Author;
  157.         } else if (argc > 3)
  158.         {
  159.             Tcl_AppendResult(interp, "wrong # args: should be \"",
  160.                      argv[0]," ",argv[1]," ?value?\"",
  161.                      (char *) NULL);
  162.             return TCL_ERROR;
  163.         }
  164.         Tcl_AppendResult(interp, (*CardRec)->author, (char *) NULL);
  165.         return TCL_OK;
  166.     } else if (strcmp(argv[1], "title") == 0)
  167.     {
  168.         if (argc == 3)
  169.         {
  170.             Title = argv[2];
  171.             (*CardRec)->title = (char*) Title;
  172.         } else if (argc > 3)
  173.         {
  174.             Tcl_AppendResult(interp, "wrong # args: should be \"",
  175.                      argv[0]," ",argv[1]," ?value?\"",
  176.                      (char *) NULL);
  177.             return TCL_ERROR;
  178.         }
  179.         Tcl_AppendResult(interp, (*CardRec)->title, (char *) NULL);
  180.         return TCL_OK;
  181.     } else if (strcmp(argv[1], "publisher") == 0)
  182.     {
  183.         if (argc == 3)
  184.         {
  185.             Publisher = argv[2];
  186.             (*CardRec)->publisher = (char*) Publisher;
  187.         } else if (argc > 3)
  188.         {
  189.             Tcl_AppendResult(interp, "wrong # args: should be \"",
  190.                      argv[0]," ",argv[1]," ?value?\"",
  191.                      (char *) NULL);
  192.             return TCL_ERROR;
  193.         }
  194.         Tcl_AppendResult(interp, (*CardRec)->publisher, (char *) NULL);
  195.         return TCL_OK;
  196.     } else if (strcmp(argv[1], "city") == 0)
  197.     {
  198.         if (argc == 3)
  199.         {
  200.             City = argv[2];
  201.             (*CardRec)->city = (char*) City;
  202.         } else if (argc > 3)
  203.         {
  204.             Tcl_AppendResult(interp, "wrong # args: should be \"",
  205.                      argv[0]," ",argv[1]," ?value?\"",
  206.                      (char *) NULL);
  207.             return TCL_ERROR;
  208.         }
  209.         Tcl_AppendResult(interp, (*CardRec)->city, (char *) NULL);
  210.         return TCL_OK;
  211.     } else if (strcmp(argv[1], "description") == 0)
  212.     {
  213.         if (argc == 3)
  214.         {
  215.             Description = argv[2];
  216.             (*CardRec)->description = (char*) Description;
  217.         } else if (argc > 3)
  218.         {
  219.             Tcl_AppendResult(interp, "wrong # args: should be \"",
  220.                      argv[0]," ",argv[1]," ?value?\"",
  221.                      (char *) NULL);
  222.             return TCL_ERROR;
  223.         }
  224.         Tcl_AppendResult(interp, (*CardRec)->description, (char *) NULL);
  225.         return TCL_OK;
  226.     } else if (strcmp(argv[1], "vol") == 0)
  227.     {
  228.         if (argc == 3)
  229.         {
  230.             if (Tcl_GetInt(interp, argv[2], &((*CardRec)->vol)) != TCL_OK)
  231.                 return TCL_ERROR;
  232.         } else if (argc > 3)
  233.         {
  234.             Tcl_AppendResult(interp, "wrong # args: should be \"",
  235.                      argv[0]," ",argv[1]," ?value?\"",
  236.                      (char *) NULL);
  237.             return TCL_ERROR;
  238.         }
  239.         {
  240.             ostrstream stream;
  241.             stream << (*CardRec)->vol;
  242.             _IO_ssize_t i = stream.pcount();
  243.             char *s = stream.str();
  244.             s[i] = '\0';
  245.             Tcl_AppendResult(interp,s,(char *) NULL);
  246.             stream.freeze(0);
  247.         }
  248.         return TCL_OK;
  249.     } else if (strcmp(argv[1], "year") == 0)
  250.     {
  251.         if (argc == 3)
  252.         {
  253.             if (Tcl_GetInt(interp, argv[2], &((*CardRec)->year)) != TCL_OK)
  254.                 return TCL_ERROR;
  255.         } else if (argc > 3)
  256.         {
  257.             Tcl_AppendResult(interp, "wrong # args: should be \"",
  258.                      argv[0]," ",argv[1]," ?value?\"",
  259.                      (char *) NULL);
  260.             return TCL_ERROR;
  261.         }
  262.         {
  263.             ostrstream stream;
  264.             stream << (*CardRec)->year;
  265.             _IO_ssize_t i = stream.pcount();
  266.             char *s = stream.str();
  267.             s[i] = '\0';
  268.             Tcl_AppendResult(interp,s,(char *) NULL);
  269.             stream.freeze(0);
  270.         }
  271.         return TCL_OK;
  272.     } else if (strcmp(argv[1], "delete") == 0)
  273.     {
  274.         if (argc != 2)
  275.         {
  276.             Tcl_AppendResult(interp, "wrong # args: should be \"",
  277.                      argv[0]," ",argv[1],"\"",
  278.                      (char *) NULL);
  279.             return TCL_ERROR;
  280.         }
  281.         void_pt header = Tcl_HandleXlate (interp,Handles,argv[0]);
  282.         if (header == NULL) return TCL_ERROR;
  283.         Tcl_HandleFree (Handles,header);
  284.         return Tcl_DeleteCommand(interp,argv[0]);
  285.     } else
  286.     {
  287.         Tcl_AppendResult(interp, "Bad option: ",argv[1],(char *) NULL);
  288.         return TCL_ERROR;
  289.     }
  290. }
  291.  
  292.  
  293. static void deleteTkCardRecord(ClientData clientData)
  294. {
  295.     register TkCardRecord *tkCardRecord = (TkCardRecord *)clientData;
  296.     delete tkCardRecord;
  297. }
  298.  
  299. static int tkCardRecordCommand(ClientData clientData, Tcl_Interp *interp,
  300.                int argc, char *argv[])
  301. {
  302.     register TkCardRecord *tkCardRecord = (TkCardRecord *)clientData;
  303.     return tkCardRecord->TclFunction(interp,argc,argv);
  304. }
  305.  
  306. static int tkCardRecordCreate(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[])
  307. {
  308.     register TkCardRecord *tkCardRecord;
  309.     Card *incard;
  310.  
  311.     if (argc != 1 && argc != 9)
  312.     {
  313.         Tcl_AppendResult(interp, "Wrong # args: should be \"",
  314.                  argv[0]," ?type author title ",
  315.                  "publisher city description vol year?\"",
  316.                  (char*) NULL);
  317.         return TCL_ERROR;
  318.     }
  319.     if (argc == 1) incard = new Card(Book,"","","","","",0,0);
  320.     else
  321.     {
  322.         CardType type;
  323.         int vol,year;
  324.         if (!CardTypeNameP(argv[1]))
  325.         {
  326.             Tcl_AppendResult(interp, "Bad card type: ",
  327.                      argv[1]," should be one of {",
  328.                      "book magazine cd ",
  329.                      "audiocassette album ",
  330.                      "laserdisk vhsvideo betavideo ",
  331.                      "eightmm eighttrack dat other}",
  332.                      (char *) NULL);
  333.             return TCL_ERROR;
  334.         }
  335.         type = NameType(argv[1]);
  336.         // argv[2] : author
  337.         // argv[3] : title
  338.         // argv[4] : publisher
  339.         // argv[5] : city
  340.         // argv[6] : description
  341.         if (Tcl_GetInt(interp, argv[7], &vol) != TCL_OK) return TCL_ERROR;
  342.         if (Tcl_GetInt(interp, argv[8], &year) != TCL_OK) return TCL_ERROR;
  343.         incard = new Card(type,argv[2],argv[3],argv[4],argv[5],argv[6],vol,year);
  344.     }
  345.     tkCardRecord = new TkCardRecord(incard);
  346.     delete incard;    
  347.     char handle[32];
  348.     TkCardRecord ** h = (TkCardRecord **) Tcl_HandleAlloc (TkCardRecord::Handles,handle);
  349.     *h = tkCardRecord;
  350.     Tcl_CreateCommand(interp,handle,(Tcl_CmdProc*)tkCardRecordCommand,
  351.               (ClientData)tkCardRecord,
  352.               (Tcl_CmdDeleteProc*)deleteTkCardRecord);
  353.     Tcl_AppendResult(interp,handle,(char *) NULL);
  354.     return TCL_OK;
  355. }
  356.  
  357. int TkCardRecord_Init(Tcl_Interp *interp)
  358. {
  359.     TkCardRecord::Handles = Tcl_HandleTblInit("TkCardRecord",sizeof(TkCardRecord*),64);
  360.     Tcl_CreateCommand(interp, "TkCardRecord", (Tcl_CmdProc*)tkCardRecordCreate,
  361.               (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL);
  362.     return TCL_OK;
  363. }
  364.  
  365. int createTkCardRecord(Tcl_Interp *interp,Record* record)
  366. {
  367.     if (TkCardRecord::Handles == NULL)
  368.     {
  369.         Tcl_AppendResult(interp,"TkCardRecords not Init'ed",
  370.                     (char*) NULL);
  371.         return TCL_ERROR;
  372.     }
  373.     TkCardRecord *tkCardRecord = new TkCardRecord(record);
  374.     char handle[32];
  375.     TkCardRecord ** h = (TkCardRecord **) Tcl_HandleAlloc (TkCardRecord::Handles,handle);
  376.     *h = tkCardRecord;
  377.     Tcl_CreateCommand(interp,handle,(Tcl_CmdProc*)tkCardRecordCommand,
  378.               (ClientData)tkCardRecord,
  379.               (Tcl_CmdDeleteProc*)deleteTkCardRecord);
  380.     Tcl_AppendResult(interp,handle,(char *) NULL);
  381.     return TCL_OK;
  382. }
  383.  
  384. int createTkCardRecord(Tcl_Interp *interp,CoreItem* coreitem)
  385. {
  386.     if (TkCardRecord::Handles == NULL)
  387.     {
  388.         Tcl_AppendResult(interp,"TkCardRecords not Init'ed",(char*) NULL);
  389.         return TCL_ERROR;
  390.     }
  391.     TkCardRecord *tkCardRecord = new TkCardRecord(coreitem);
  392.     char handle[32];
  393.     TkCardRecord ** h = (TkCardRecord **) Tcl_HandleAlloc (TkCardRecord::Handles,handle);
  394.     *h = tkCardRecord;
  395.     Tcl_CreateCommand(interp,handle,(Tcl_CmdProc*)tkCardRecordCommand,
  396.               (ClientData)tkCardRecord,
  397.               (Tcl_CmdDeleteProc*)deleteTkCardRecord);
  398.     Tcl_AppendResult(interp,handle,(char *) NULL);
  399.     return TCL_OK;
  400. }
  401.  
  402. int createTkCardRecord(Tcl_Interp *interp,Card* card)
  403. {
  404.     if (TkCardRecord::Handles == NULL)
  405.     {
  406.         Tcl_AppendResult(interp,"TkCardRecords not Init'ed",(char*) NULL);
  407.         return TCL_ERROR;
  408.     }
  409.     TkCardRecord *tkCardRecord = new TkCardRecord(card);
  410.     char handle[32];
  411.     TkCardRecord ** h = (TkCardRecord **) Tcl_HandleAlloc (TkCardRecord::Handles,handle);
  412.     *h = tkCardRecord;
  413.     Tcl_CreateCommand(interp,handle,(Tcl_CmdProc*)tkCardRecordCommand,
  414.               (ClientData)tkCardRecord,
  415.               (Tcl_CmdDeleteProc*)deleteTkCardRecord);
  416.     Tcl_AppendResult(interp,handle,(char *) NULL);
  417.     return TCL_OK;
  418. }
  419.  
  420. int createTkCardRecord(Tcl_Interp *interp,CardRecord& cardrecord)
  421. {
  422.     if (TkCardRecord::Handles == NULL)
  423.     {
  424.         Tcl_AppendResult(interp,"TkCardRecords not Init'ed",(char*) NULL);
  425.         return TCL_ERROR;
  426.     }
  427.     TkCardRecord *tkCardRecord = new TkCardRecord(cardrecord);
  428.     char handle[32];
  429.     TkCardRecord ** h = (TkCardRecord **) Tcl_HandleAlloc (TkCardRecord::Handles,handle);
  430.     *h = tkCardRecord;
  431.     Tcl_CreateCommand(interp,handle,(Tcl_CmdProc*)tkCardRecordCommand,
  432.               (ClientData)tkCardRecord,
  433.               (Tcl_CmdDeleteProc*)deleteTkCardRecord);
  434.     Tcl_AppendResult(interp,handle,(char *) NULL);
  435.     return TCL_OK;
  436. }
  437.  
  438. TkCardRecord* FindCardByHandle(Tcl_Interp *interp,char* handle)
  439. {
  440.     void_pt ptr = Tcl_HandleXlate(interp,TkCardRecord::Handles,handle);
  441.     if (ptr == NULL) return NULL;
  442.     return (*((TkCardRecord**)ptr));
  443. }
  444.